#include "syntax_ana.h"

using namespace std;

bool _check_the_val(Json*& jval, std::string& val){
    if (val[0] == '"')
    { // 字符串
        val = val.substr(1, val.length()-2);
        jval = new Json(val);
    } 
    else if (val == "false")
    { // false bool
        jval = new Json(false);
    }
    else if (val == "true")
    {
        jval = new Json(true);
    }
    else if (val == "null")
    {
        jval = new Json();
    }
    else if (val[0] == '[' || val[0] == '{') // 数组 对象
    { 
        return false;
    }
    else // 数字
    {
        // cout << "num="<< val << endl;
        double num = stod(val);
        jval = new Json(num);
    }
    return true;
}


// 分析token序列，转换为Json
Json *json_parse(vector<string> &tokens, int& i)
{
    // 顶层 object 
    Json_Object *top_obj=nullptr; // {}  

    int n = tokens.size();
    if (i>=n)
        return nullptr;
    if (tokens[i] != "{")
    {
        throw "error: not start with {";
    }
    else
    {
        // 顶层对象
        top_obj = new Json_Object(); 
    } 
    i++;
    while (i < n)
    {
        // 1遇到 } 结束 顶级对象 结束
        if (tokens[i] == "}")
        { 
            break;  
        }
        // 遇到 ,  继续
        else if (tokens[i][0] == ',')
        {
            ++i;
            continue;
        } 
        // 遇到key：val 读取后放入
        else if (tokens[i][0] == '"')
        {
            if (tokens[i + 1] == ":")
            {
                string key = tokens[i];
                key = key.substr(1, key.length()-2);
                string val = tokens[i + 2];
                i += 3;  // 跳过 key : val 到了
                Json *jval=nullptr;
                if(_check_the_val(jval, val)){
                    // 基本类型 pass
                
                }else if (val[0] == '[') // 数组
                {  
                    auto arr = new Json_Array();
                    // 循环
                    val = tokens[i];
                    while( val[0] != ']' ){
                        if(val == ","){
                            // pass
                        }else if(_check_the_val(jval, val)){
                            // 基本类型
                            arr->add(jval);
                        }
                        else if (val[0] == '{') // 对象  key : [ {i ...  }
                        { 
                            jval = json_parse(tokens, i); 
                            arr->add(jval);
                        }
                        i++;
                        val = tokens[i];
                        
                    }
                    ++i; // 跳过 ]
                    jval = arr;
                }
                else if (val[0] == '{') // 对象
                { 
                    i--; // 回到 {
                    jval = json_parse(tokens, i); // 结束时候 i指向 } 结尾
                    ++i;  // 跳过 }
                }
                
                top_obj->insert(key, jval);
            }
            else
            {
                cout << tokens[i] << "  " << tokens[i+1] << endl;
                throw "error:must 'key: value' format..";
            }
        }
        else
        {
            printf("other: i=[%d], str=[%s]", i,  tokens[i].c_str());
            ++i; 
        }
    }

    return top_obj;
}



#include "lex_ana.h"
Json* Json::parse_string(string &s){
    Lexical_Analysis la;
    vector<string> tokens = la.analysis(s);
    int i=0;
    return json_parse(tokens, i);
}
 